﻿using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioCnae : IRepositorioCnae
    {
        public Cnae Inserir(Cnae cnae)
        {
            cnae.FimVigencia = cnae.FimVigencia.HasValue 
                                ? cnae.FimVigencia.GetValueOrDefault().Date 
                                : cnae.FimVigencia;
            cnae.InicioVigencia = cnae.InicioVigencia.HasValue 
                                    ? cnae.InicioVigencia.GetValueOrDefault().Date 
                                    : cnae.InicioVigencia;

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(cnae);
            return cnae;
        }

        public Cnae Atualizar(Cnae cnae)
        {
            Cnae tmpCnae = ObterPorId(cnae.CnaeId);

            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpCnae.Codigo = cnae.Codigo;
            tmpCnae.Descricao = cnae.Descricao;
            tmpCnae.FimVigencia = cnae.FimVigencia.HasValue 
                                    ? cnae.FimVigencia.GetValueOrDefault().Date 
                                    : cnae.FimVigencia;
            tmpCnae.InicioVigencia = cnae.InicioVigencia.HasValue 
                                        ? cnae.InicioVigencia.GetValueOrDefault().Date 
                                        : cnae.InicioVigencia;
            tmpCnae.NeturionLog = cnae.NeturionLog;

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpCnae);
            return tmpCnae;
        }

        public void Excluir(Cnae cnae)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(cnae);
        }

        public Cnae ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cnae))
                .Add(Restrictions.Eq("Codigo",codigo));
            return criteria.UniqueResult<Cnae>();
        }

        public IList<Cnae> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cnae));
            return criteria.List<Cnae>() as List<Cnae>;
        }

        public Cnae ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Cnae>(id);
        }

        public IList<Cnae> ObterPorDescricao(string descricao)
        {
            ICriteria criteria =
               GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cnae)).Add(
                   Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            return criteria.List<Cnae>() as List<Cnae>;
        }

        public IList<Cnae> ObterTodos(int inicio, int quantidade, int quantidadeMinima, string codigo, string descricao, DateTime? inicioVigencia, DateTime? fimVigencia)
        {
            if(quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            IList<Cnae> list;
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cnae))
               .SetFirstResult(inicio).SetMaxResults(quantidade);
            
            if (! string.IsNullOrEmpty(codigo))
            {
                criteria.Add(Restrictions.Eq("Codigo", codigo));
            }

            if (! string.IsNullOrEmpty(descricao))
            {
                criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            }

            if (inicioVigencia.HasValue)
            {
                criteria.Add(Restrictions.Eq("InicioVigencia", inicioVigencia.Value.Date)); 
            }

            if (fimVigencia.HasValue)
            {
                criteria.Add(Restrictions.Eq("FimVigencia", fimVigencia.Value.Date));
            }
           
            list = criteria.List<Cnae>() as List<Cnae>;


            

            //list = (from cnae in GerenciadorBDConfigs.Instance.SessaoAtual().Query<Cnae>()
            //        select cnae).Skip(inicio).Take(quantidade).ToList();

            return list;
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cnae)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("CnaeId"));


            Cnae cnae = criteria.UniqueResult<Cnae>();
            int ultimoCodigo = cnae != null ? cnae.CnaeId : 0;

            return ultimoCodigo;
        }
    }
}